package com.wang.interview.jvm;

/**
 * @author: wang
 * @date: 2021/8/12 16:46
 * @description: //java -XX:+PrintFlagsInitial
 * -Xmn 设置年轻代大小
 * -Xms1000m  // 简写必须要带后缀
 * -Xmx1000m
 * -Xss100k  = -XX:ThreadStackSize=100, 配置单线程栈内存，默认为0，使用的是默认配置
 * // 查看相关的命令
 * jps -l
 * jstack port
 * jinfo flag 命令 port
 * jinfo flags port
 *
 * -XX:+PrintFlagsInitial
 * -XX:+PrintFlagsFinal
 * -XX:+PrintCommandLineFlags // 配置这个会在启动时打印如下信息
 *
 * -XX:InitialHeapSize=10485760
 * -XX:MaxHeapSize=3166689280
 * -XX:MetaspaceSize=104857600
 * -XX:+PrintCommandLineFlags
 * -XX:ThreadStackSize=100
 * -XX:+UseCompressedClassPointers
 * -XX:+UseCompressedOops
 * -XX:-UseLargePagesIndividualAllocation
 * -XX:+UseParallelGC                      // 默认是并行垃圾回收器dialog
 *
 * 典型设置案例
 * -Xms128m
 * -Xmx4096m
 * -Xss1024k
 * -XX:MetaspaceSize=512m
 * -XX:+PrintCommandLineFlags
 * -XX:+PrintGCDetails              // 配置了这个结合上面的，在启动时能打印多一行 GC 的信息，在程序结束时会打印出详细的垃圾回收信息
 * -XX:+UseSerialGC
 * // 多的一行：
 * [GC (Allocation Failure) [PSYoungGen: 2048K->504K(2560K)] 2048K->847K(9728K), 0.0074299 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
 * 垃圾回收信息
 * Heap
 *  PSYoungGen      total 56832K, used 5904K [0x0000000781180000, 0x0000000785080000, 0x00000007c0000000)
 *   eden space 49152K, 12% used [0x0000000781180000,0x0000000781744338,0x0000000784180000)
 *   from space 7680K, 0% used [0x0000000784900000,0x0000000784900000,0x0000000785080000)
 *   to   space 7680K, 0% used [0x0000000784180000,0x0000000784180000,0x0000000784900000)
 *  ParOldGen       total 130048K, used 0K [0x0000000703400000, 0x000000070b300000, 0x0000000781180000)
 *   object space 130048K, 0% used [0x0000000703400000,0x0000000703400000,0x000000070b300000)
 *  Metaspace       used 3333K, capacity 4496K, committed 4864K, reserved 1056768K
 *   class space    used 366K, capacity 388K, committed 512K, reserved 1048576K
 *
 *   其它：
 *    -XX:SurvivorRatio=4，则为 Eden:S0:S1 = 4:1:1
 *    -XX:NewRatio=2 新生代占1，老年代2，年轻代占整个堆的1/3
 *    -XX:MaxTenuringThreshold=0：设置垃圾最大年龄。0-15，默认15
 *
 * ======================================================================================垃圾回收器
 * 默认 ：PSYoungGen，ParOldGen
 * 使用G1： -XX：+UseG1GC
 * 新生区：serial 线性 阻塞最长，parNew 并行 阻塞第二， parallel Scavenge 并行 吞吐量优先，会自动调整阻塞时间
 * 老年区：SerialOld 和 serial一样，parallelOld 并行 ps 的老年版本，concurrentMarkSweep CMS 并发（和用户线程一起执行，不阻塞）
 * 组合方式：
 * 1，1  -XX:+UseSerialGC都是线性，单CPU或者小内存，单机程序；
 * 2，3  -XX:+UseConcMarkSweepGC 或 -XX:+ParNewGC 追求低停顿，适合多cpu和大内存
 * 3，2和1(1兜底)  -XX:+UseParallelGC -XX:+UseParallelOldGC（相互激活，只需要配置一个），自带最大吞吐量策略，需要最大的吞吐量，如后台计算型应用
 *
 *更牛逼的 G1，原理是：堆分块(Region地区) 1-32MB 2048块，宏观一体，微观每个块代表不同的区，能够转换提升，大对象(Humongous极大的)放在连续的Old区
 * G1 配置：
 *  1. -XX:+UseG1GC
 *  2. -Xmx32g
 *  3. -XX:MaxGCPauseMillis=100  // 预设最大回收阻塞时间，可能会超
 * 算法统计：
 * 新生代 serial，parNew，parallel scavenge 全是 复制算法
 * 老年代 serial 标整， parallel Old 标整， CMS 标清(会造成内存不连续)
 * GFirst G1 整体上采用标记-整理算法，局部是通过复制算法，不会产生内存碎片
 *
 * G1 详见 qq浏览器，博客，jvm，G1垃圾回收详解
 *
 */
public class T1 {
    public static void main(String[] args) {
        System.out.println(" ");
        //try { TimeUnit.SECONDS.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { e.printStackTrace(); }
    }
}
